package com.shilei.c05_1_ThreadLocalAndRefType;

import java.lang.ref.WeakReference;

/**
 * @description: 弱引用遭到gc就会回收   一般用在容器里
 *                当强引用指向一个 对象地址
 *                弱引用也同样指向这个目标地址
 *                当强引用为NULL时
 *                弱引用也将会被回收
 * @author: 81271
 * @date: 2020-06-20 16:03
 */
public class T03_WeakReference {

    public static void main(String[] args) {
        WeakReference<M> m = new WeakReference<>(new M());

        System.out.println(m.get());
        System.gc();
        System.out.println(m.get());

        /**
         * ThreadLocal  里面的Entry继承了WeakReference  就是一个弱引用
         *              如果它是强引用  成员变量ThreadLocal为null时
         *              ThreadLocalMap 里面的Entry仍然是存在的，所以可能存在内存泄漏
         *              但弱引用就不会
         *              但entry为弱引用只是把 map的Key值变null了
         *              实体仍然存在,所以 将成员变量ThreadLocal为null时还需要调 remove()方法
         * */
        ThreadLocal<M> tl = new ThreadLocal<>();
        tl.set(new M());
        tl.remove();

    }
}
